package org.evil.dog.gateway.utils;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @Author:yanxiao
 * @Des:
 * @Date:2017/11/16
 */
public class ZMDateTimeUtil {
    /**
     * yyyy 年
     * MM 月
     * dd 天
     * HH 24小时制
     * mm 分钟
     * ss 秒
     */
    private final static String DEFAULT = "yyyy-MM-dd HH:mm:ss";
    public static String formMatter(Date dateTime, String zone,String fmt){
        ZoneId offset = ZoneId.systemDefault();
        try {
            offset = ZoneId.of(zone);
        } catch (Exception e) {
            //e.printStackTrace();
        }
        LocalDateTime localDateTime = LocalDateTime.ofInstant(dateTime.toInstant(), offset);
        return localDateTime.format(DateTimeFormatter.ofPattern(fmt==null?DEFAULT: fmt));
    }
    /**
     * 时间按时区转换成时区所
     *
     * @param dateTime 时间
     * @param zone     时区(格式如:GMT+00:30),格式不对则返回系统默认时区格式化的
     * @return 格式化后的时间显示
     */
    public static String formMatter(Date dateTime, String zone) {
       return  formMatter(dateTime, zone,DEFAULT);
    }

    /**
     * 根据时区偏移量格式化时间
     * @param dateTime 当前时间
     * @param offset 偏移量
     * @return 返回格式化后的时间
     */
    public static String formMatter(Date dateTime, int offset) {
        return formMatter(dateTime,offset,DEFAULT);
    }
    public static String formMatter(Date dateTime, int offset,String fmt) {
        ZoneOffset zoneOffset = ZoneOffset.ofTotalSeconds(offset);
        return formMatter(dateTime,zoneOffset.getId(),fmt);
    }

    public static String getZoneId(int offset) {
        ZoneOffset zoneOffset = ZoneOffset.ofTotalSeconds(offset);
        return zoneOffset.getId();
    }


    /**
     * 获取一天最后时刻
     *
     * @param date 日期时间
     * @param zone 时区
     * @return 返回最后天日期时间
     */
    public static Date endDay(Date date, String zone) {
        ZoneId offset = ZoneId.systemDefault();
        try {
            offset = ZoneId.of(zone);
        } catch (Exception e) {
            //e.printStackTrace();
        }
       return getEndDayDate(date, offset);
    }

    /**
     *
     * 获取一天最后时刻
     * @param date 当前时间
     * @param offset 当前时间时区偏移量 北京时间28800
     * @return 返回 0:年月日00:00:00.000 1:年月日23:59:59.999
     */
    public static Date[] getStartAndEndDay(Date date, int offset) {
        ZoneOffset zoneOffset = ZoneOffset.ofTotalSeconds(offset);
        Date end=getEndDayDate(date, zoneOffset);
        Date start=new Date(end.getTime()-86400000+1000);
        Date[] startAndEndDay=new Date[2];
        startAndEndDay[0]=start;
        startAndEndDay[1]=end;
        return startAndEndDay;
    }



    private static Date getEndDayDate(Date date, ZoneId zoneOffset) {
        LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), zoneOffset);
        localDateTime = localDateTime.withHour(23).withMinute(59).withSecond(59).withNano(999);
        Instant instant = localDateTime.atZone(zoneOffset).toInstant();
        return Date.from(instant);
    }


    public static void main(String[] args) {
        //++++++++++时间戳+++++++++++++++++++++
        Date date = new Date();
        System.out.println("当前时区：" + ZMDateTimeUtil.formMatter(date, "GMT+0900"));
        System.out.println("当前时区偏移量：" + ZMDateTimeUtil.formMatter(date, 28800));
        System.out.println("当前最后一刻：" + ZMDateTimeUtil.formMatter(ZMDateTimeUtil.endDay(date, "28800"), "GMT+08:00"));
        Date[]d= ZMDateTimeUtil.getStartAndEndDay(date,28800);
        System.out.println("当前天>>起:" + ZMDateTimeUtil.formMatter(d[0], 28800)+";止:"+ ZMDateTimeUtil.formMatter(d[1], 28800));
        //+++++++++++++++++++++++++++++++
    }

}
